home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / crc.swg / 0015_Fast 16bit CRC.pas < prev    next >
Pascal/Delphi Source File  |  1994-05-25  |  2KB  |  75 lines

  1.  
  2. {
  3. RE:     SWAG submission
  4.         This 16-bit CRC function is compatible with those used in Chuck
  5.         Forsberg's X-modem protocol.  It's very fast, because I unrolled
  6.         the "for (i = 0; i < 8; ++i)" loop.  If a 32-bit CRC is not
  7.         necessary, this is a great alternative because of its speed and
  8.         small size.
  9.  
  10.  
  11.  
  12. {==============================================================}
  13. FUNCTION Crc16 (var buffer; size, seed: word): word; assembler;
  14.  
  15. { Set size parameter to 0 to process 64K.  If processing only one buffer, set
  16.   seed parameter to 0 -- otherwise set to result from previous calculation.
  17.   C code translated by Don Paulsen. }
  18.  
  19. (* This routine is a translation of the following C code by Chuck Forsberg.
  20.    The added "seed" parameter allows for finding the CRC value of data spanning
  21.    multiple buffers.  The innermost loop has been unrolled at a cost of 32
  22.    bytes in code, but the speed increase is nearly two-fold.
  23.  
  24.      int    Crc16 (ptr, count)
  25.      char   *ptr;
  26.      int    count;
  27.  
  28.      {   int crc, i;
  29.  
  30.          crc = 0;
  31.          while (--count >= 0) {
  32.             crc = crc ^ (int)*ptr++ << 8;
  33.             for (i = 0; i < 8; ++i)
  34.                 if (crc & 0x8000)
  35.                     crc = crc << 1 ^ 0x1021;
  36.                 else
  37.                     crc = crc << 1;
  38.           }
  39.          return (crc & 0xFFFF);
  40.      }
  41. *)
  42.  
  43. ASM
  44.     les     di, buffer
  45.     mov     dx, size
  46.     mov     ax, seed
  47.     mov     si, 1021h
  48. @next:
  49.     xor     bl, bl
  50.     mov     bh, es:[di]
  51.     xor     ax, bx
  52.  
  53.     shl  ax, 1;    jnc  @noXor1;    xor  ax, si
  54. @noXor1:
  55.     shl  ax, 1;    jnc  @noXor2;    xor  ax, si
  56. @noXor2:
  57.     shl  ax, 1;    jnc  @noXor3;    xor  ax, si
  58. @noXor3:
  59.     shl  ax, 1;    jnc  @noXor4;    xor  ax, si
  60. @noXor4:
  61.     shl  ax, 1;    jnc  @noXor5;    xor  ax, si
  62. @noXor5:
  63.     shl  ax, 1;    jnc  @noXor6;    xor  ax, si
  64. @noXor6:
  65.     shl  ax, 1;    jnc  @noXor7;    xor  ax, si
  66. @noXor7:
  67.     shl  ax, 1;    jnc  @noXor8;    xor  ax, si
  68. @noXor8:
  69.  
  70.     inc     di
  71.     dec     dx
  72.     jnz     @next
  73. END;
  74.  
  75.